package com.luxsoft.siipap.service.ventas;

import java.util.Date;

import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.luxsoft.siipap.dao.core.FolioDao;
import com.luxsoft.siipap.model.core.Folio;
import com.luxsoft.siipap.service.KernellSecurity;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.sw3.ventas.Pedido;
import com.luxsoft.utils.LoggerHelper;


@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
public class PedidosManagerImpl implements PedidosManager{
	
	protected Logger logger=LoggerHelper.getLogger();
	
	@Autowired
	private FolioDao folioDao;
	
	private HibernateTemplate hibernateTemplate;

	@Transactional(propagation=Propagation.REQUIRED)
	public Pedido salvar(Pedido pedido,String usuario) {
		registrarBitacora(pedido,usuario);
		return doSalvar(pedido);
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	private Pedido doSalvar(Pedido pedido){
		Assert.isTrue(!pedido.isFacturado(),"El pedido ya esta facturado por lo que no es posible actualizar ni modificar");
		if(pedido.getId()==null){
			Folio folio=folioDao.buscarNextFolio(pedido.getSucursal(), "PEDIDO");
			pedido.setFolio(folio.getFolio());
			folioDao.save(folio);
		}
		return (Pedido)getHibernateTemplate().merge(pedido);
	}
	
	@Transactional(propagation=Propagation.MANDATORY)
	private void registrarBitacora(Pedido target,String user){
		Date creado = ServiceLocator2.obtenerFechaDelSistema();
        if(target.getId() == null)
        {
            target.getLog().setCreado(creado);
            target.getLog().setCreateUser(user);
            target.getAddresLog().setCreatedMac(KernellSecurity.getMacAdress());
            target.getAddresLog().setCreatedIp(KernellSecurity.getIPAdress());
        }
        target.getLog().setModificado(creado);
        target.getLog().setUpdateUser(user);
        target.getAddresLog().setUpdatedIp(KernellSecurity.getIPAdress());
        target.getAddresLog().setUpdatedMac(KernellSecurity.getMacAdress());
        
	}

	@Transactional(propagation=Propagation.REQUIRED)
	public Pedido get(String id) {
		Pedido p= (Pedido)getHibernateTemplate().get(Pedido.class,id);
		Hibernate.initialize(p.getCliente().getTelefonos());
		Hibernate.initialize(p.getCliente().getContactos());
		Hibernate.initialize(p.getCliente().getComentarios());
		//System.out.println("Telefonos inicializados: "+p.getCliente().getTelefonos().size());
		return p;
	}

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}


	public FolioDao getFolioDao() {
		return folioDao;
	}


	public void setFolioDao(FolioDao folioDao) {
		this.folioDao = folioDao;
	}
	
	
}
